/**
 * 作者: wgx
 * 日期: 2024-11-04 17:29:55
 * 备注: 用户邮件表
 */
package com.motu.monstercity.server.game.userdata;

import com.motu.monstercity.protocol.Common.PBUserMail;
import com.motu.monstercity.server.game.base.AllParam;
import com.motu.monstercity.server.game.base.GameConstant;
import com.motu.monstercity.server.game.log.LogType;
import com.motu.monstercity.server.game.logic.MailManager;
import com.motu.monstercity.server.game.logic.RewardItem;
import com.motu.vertx.module.utility.toolset.TimeUtils;
import com.motu.vertx.module.utility.toolset.Tool;
import io.vertx.core.json.JsonArray;

import java.util.ArrayList;
import java.util.List;

public class UserMail extends UserMailModel {
    protected boolean isSomeReward = false; // 是否领取部分奖励，只领取部分奖励，则不能删除，领取状态不能改成已领取状态

    public boolean getIsSomeReward() {
        return isSomeReward;
    }

    public void putIsSomeReward(boolean isSomeReward) {
        this.isSomeReward = isSomeReward;
    }

    public UserMail() {
        super();
    }

    // 邮件
    public UserMail(long userid, byte mailType, String title, String content, int logType, String item, String titleReplace, String contentReplace) {
        super();
        putUserId(userid); // 用户ID
        putMailType(mailType);// 邮件类型
        putLogType(logType); // 日志类型
        putTitle(title); // 标题
        putContent(content); // 内容
        putAddTime(TimeUtils.getCurTime()); // 创建时间
        putItem(item); // 附件
        putTitleReplace(titleReplace);
        putContentReplace(contentReplace);
    }

    public PBUserMail.Builder takeInitBuilder(int language) {
        PBUserMail.Builder sb = super.takeInitBuilder();
        sb.setTitle(MailManager.takeWordSting(getTitle(), language, getTitleReplace()));
        sb.setContent(MailManager.takeWordSting(getContent(), language, getContentReplace()));
        List<RewardItem> list = MailManager.takeRewardItem(getItem());
        if (list.size() > 0) {
            for (RewardItem rewardItem : list) {
                sb.addItem(rewardItem.takeBuilder());
            }
        }
        return sb;
    }

    // 是否已读
    public boolean isRead() {
        return getIsRead() == 1;
    }

    // 是否已领取奖励
    public boolean isGet() {
        return getIsGet() == 1;
    }

    // 是否重要邮件
    public boolean isImportant() {
        return getMailType() == 1;
    }

    // 是否已经过了有效期
    public boolean isTimeExpire() {
        long diffTime = TimeUtils.getCurTime() - getAddTime();
        if (isImportant() && diffTime >= AllParam.MAIL_MESSAGE_TIME[2]) {// 重要邮件
            return true;
        }
        if (!isImportant() && hasItems() && diffTime >= AllParam.MAIL_MESSAGE_TIME[1]) {// 有附件的普通邮件
            return true;
        }
        if (!isImportant() && !hasItems() && diffTime >= AllParam.MAIL_MESSAGE_TIME[0]) {// 无附件的普通邮件
            return true;
        }

        return false;
    }

    //  日志类型
    public int takeLogType() {
        if (getLogType() > 0) {
            return getLogType();
        } else {
            return LogType.MAIL_GET_REWARD;
        }
    }

    /****
     * 判断邮件是否有附件
     */
    public boolean hasItems() {
        if (Tool.isEmpty(this.getItem())) {
            return false;
        }
        JsonArray array = new JsonArray(this.getItem());
        return !array.isEmpty();
    }

    // 这个邮件里附件里的武器数量
    public int getWeaponNum() {
        int num = 0;
        for (RewardItem rewardItem : MailManager.takeRewardItem(getItem())) {
            int itemId = rewardItem.getItemId();
            int itemType = GameConstant.getItemType(itemId);// itemid的类型
            if (itemType == GameConstant.REWARD_TYPE_WEAPON) {//  武器
                num += rewardItem.getItemNum();
            }
        }
        return num;
    }

    // 奖励内是否只有武器，没有其他奖励
    public boolean isOnlyWeapon() {
        if (Tool.isEmpty(getItem())) {
            return false;
        }

        for (RewardItem rewardItem : MailManager.takeRewardItem(getItem())) {
            int itemId = rewardItem.getItemId();
            int itemType = GameConstant.getItemType(itemId);// itemid的类型
            if (itemType != GameConstant.REWARD_TYPE_WEAPON) {//  武器
                return false;
            }
        }
        return true;
    }

    // 获取该邮件可以领取的奖励，如果只领取部分奖励，则把isGetSomeReward 标识为true. 把奖励内容改成剩余的奖励
    public List<RewardItem> takeRewardItem(int weaponNum) {
        if (Tool.isEmpty(getItem())) {
            return null;
        }
        List<RewardItem> result = new ArrayList<>();
        List<RewardItem> weaponReward = new ArrayList<>();// 剩余的武器奖励

        boolean isSome = false;
        int max = AllParam.WEAPON_NUM_MAX;// 武器数量上限
        for (RewardItem rewardItem : MailManager.takeRewardItem(getItem())) {
            int itemId = rewardItem.getItemId();
            int itemType = GameConstant.getItemType(itemId);// itemid的类型
            if (itemType == GameConstant.REWARD_TYPE_WEAPON) {//  武器
                if (weaponNum + rewardItem.getItemNum() > max) {// 超过上限
                    isSome = true;
                    weaponReward.add(rewardItem);
                } else {
                    result.add(rewardItem);
                    weaponNum += rewardItem.getItemNum();
                }
            } else {
                result.add(rewardItem);
            }
        }

        if (isSome) {
            String newReward = MailManager.getMailItem(weaponReward);
            putItem(newReward);
            putIsSomeReward(true);
        }
        return result;
    }
}
